iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
Modern Web

用 Node.js 打造後端 API系列 第 8

Day 08 - 建立Model Relationships

  • 分享至 

  • xImage
  •  

前言


處理完getBootcamps controller的邏輯後(filtering, select, sort, pagination)
接著我們要建立另一組course的資料,並reference至Bootcamp model

這樣做的目的有兩個:

  • 使用者向伺服器請求courses的資料時,能一併回傳對應的bootcamp資料
  • 使用者能透過輸入bootcampId, 得到對應的courses資料

建立Course Model


const mongoose = require('mongoose');

const CourseSchema = new mongoose.Schema({
  title: {
    type: String,
    trim: true,
    required: [true, 'Please add a course title']
  },
  description: {
    type: String,
    required: [true, 'Please add a description']
  },
    createdAt: {
    type: Date,
    default: Date.now
  },
  bootcamp: {
    type: mongoose.Schema.ObjectId,
    ref: 'Bootcamp',
    required: true
  }
});

module.exports = mongoose.model('Course', CourseSchema);

可以看到在schema的後面reference Bootcamp model

建立Course Controller


在controllers資料夾新增courses.js file
接著我們要處理兩個GET request

  • GET /api/v1/courses, 單純地請求全部的courses資料
  • GET /api/v1/bootcamps/:bootcampId/courses, 請求指定bootcamp對應到的courses資料

因此,當使用者有輸入bootcampId時,我們就能在courses資料庫中找到含有該id的courses資料

let query;

if (req.params.bootcampId) {
const bootcamp = await Bootcamp.findById(req.params.bootcampId);

if (!bootcamp) {
  return next(
    new ErrorResponse(`Bootcamp not found with id of ${req.params.bootcampId}`, 404)
  );
} // 若輸入格式相同但錯誤的bootcampId, return error message

query = Course.find({ bootcamp: req.params.bootcampId });
} else {
query = Course.find();
}

const courses = await query;

上一篇
Day 07 - 進階搜尋結果3
下一篇
Day 09 - 不同筆資料間的互動
系列文
用 Node.js 打造後端 API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言